#pragma once
#include <vector>
namespace HW2{

	struct Matrix
	{

		std::vector<double> data;

		Matrix();
		double& get(int r, int c);
		double& operator()(int r, int c);
		
		Matrix operator*(Matrix &other);
		void operator*=(Matrix &other);
		// equivalent to this = other*this;
		void multiplyLeftSide(Matrix &other);
		// Multiply this matrix left or right
		void multiplySide(Matrix &other, bool leftSide);


		static Matrix perspective(double d);
		static Matrix perspectiveWarp(double d, double a);
		static Matrix orthographic();
		static Matrix scale(double a);
		static Matrix scale(double x, double y, double z);
		static Matrix rotateX(double a);
		static Matrix rotateY(double a);
		static Matrix rotateZ(double a);
		static Matrix move(double x, double y, double z = 0);
		static Matrix I();
	};

}